import axios, { AxiosError, AxiosRequestConfig, AxiosResponse } from 'axios'
import { showMessage, showMessageConfirm } from '@/utils/element'
import { useUserStore } from '@/store/modules/user'
import { dinglogin } from '@/utils/database'
declare module 'axios' {
  interface AxiosInstance {
    (config: AxiosRequestConfig): Promise<any>
  }
}
// 创建axios实例 进行基本参数配置
const service = axios.create({
  // 默认请求地址，根据环境的不同可在.env 文件中进行修改
  baseURL: import.meta.env.VITE_APP_BASE_API,
  // 设置接口访问超时时间
  timeout: 3000000, // request timeout，
  // 跨域时候允许携带凭证
  withCredentials: true,
})
const userStore = useUserStore()
//  request interceptor 接口请求拦截
service.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    /**
     * 用户登录之后获取服务端返回的token,后面每次请求都在请求头中带上token进行JWT校验
     * token 存储在本地储存中（storage）、vuex、pinia
     */

    const token: string = userStore.token
    // 自定义请求头
    // const tokenAuth =
    //   'eyJhbGciOiJIUzM4NCJ9.eyJzdWIiOiJ7XCJ1bmlvbktleVwiOlwiZTlkMzViMjllNmNlNDJkOGEzNmYzZDU2YWY5OWQ3M2JcIixcInBhcmVudFVuaW9uS2V5XCI6XCIxNTA5NjllOGIyYWI0MGVhYWY2M2ViZDI2MGFmNmRjYVwiLFwidXNlcklkXCI6MixcInJvbGVcIjpudWxsLFwiZXhwaXJlVGltZVwiOlwiMjAyNC0wMi0yMCAxNjozNzowN1wifSIsImlhdCI6MTcwODQxNjQyNywiZXhwIjoxNzA4NDE4MjI3fQ.hXoC1e-fkKgezeasw181JQ_iNgWU9o_oqAdIMbFPXhc0ytizi-0U33BclzJGDYs7'

    if (token) {
      config.headers['Authorization'] = token
    }

    return config
  },
  (error: AxiosError) => {
    // 请求错误，这里可以用全局提示框进行提示
    return Promise.reject(error)
  },
)

//  response interceptor 接口响应拦截
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 直接返回res，当然你也可以只返回res.data
    // 系统如果有自定义code也可以在这里处理
    if (response.data.code && response.data.code == 200) {
      return response.data.data
    } else if (response.data.code == 402) {
      showMessageConfirm(
        '提示',
        '当前登录已经过期，是否前往登录?',
        '前往登录',
        '取消',
        () => {
          userStore.token = ''
          dinglogin()
        },
        () => {},
      )
    } else if (response.data.code == 403) {
      showMessage(response.data.msg || '报错', 'warning')
      return false
    } else if (response.data.code == 406) {
      showMessageConfirm(
        '提示',
        '当前登录已经被占用，是否前往登录?',
        '前往登录',
        '取消',
        () => {
          userStore.token = ''
          dinglogin()
        },
        () => {},
      )
      return false
    } else if (response.data.code == 400) {
      showMessage(response.data.msg || '报错', 'warning')
      return false
    } else {
      return response
    }
  },
  (error: AxiosError) => {
    return Promise.reject(error)
  },
)

// /**
//  * @description 显示错误消息
//  * opt 传入参数
//  * err 错误信息
//  * type 消息类型
//  * duration 消息持续时间
//  */
// function showErrMessage(opt, err, type: any = 'error', duration = 5000) {
//   ElMessage({
//     message: err.msg,
//     type: type,
//     duration: duration,
//   });
// }

export default service
